﻿using Autofac.Extensions.DependencyInjection;
using Autofac;
using FreeDream.DBUtility;
using Microsoft.EntityFrameworkCore;
using System.Reflection;

namespace FreeDream.WebApi
{
    public class readme
    {
        public void Autofac()
        {
            #region 初始化Autofac，注入程序集

            ////autofac
            //builder.Host.UseServiceProviderFactory(new AutofacServiceProviderFactory());
            //builder.Host.ConfigureContainer<ContainerBuilder>(builder =>
            //{
            //    #region 手动注入

            //    builder.RegisterType<BloggingContext>().As<DbContext>().InstancePerLifetimeScope();//单例注入 scope
            //    ////手动注入
            //    //builder.RegisterType<AService>().As<IAService>().InstancePerLifetimeScope();
            //    //builder.RegisterType<BService>().As<IBService>().InstancePerLifetimeScope();

            //    builder.RegisterType<BlogService>().As<IBlogService>().AsImplementedInterfaces().InstancePerLifetimeScope();
            //    //builder.RegisterType<Dn.Repository.BaseRepository>().As<Dn.Repository.IBaseRepository>().AsImplementedInterfaces().InstancePerLifetimeScope(); 
            //    builder.RegisterType<Dn.DBUtility.BlogReposity>().As<Dn.DBUtility.IBlogReposity>().AsImplementedInterfaces().InstancePerLifetimeScope();
            //    builder.RegisterType<Dn.DBUtility.UnitOfWork>().As<Dn.DBUtility.IUnitOfWork>().AsImplementedInterfaces().InstancePerLifetimeScope();

            //    #endregion

            //    #region 自动注入

            //    //4、自动注册接口
            //    //* 筛选出对应条件的接口
            //    //* IsAssignableFrom：返回true的条件：是否直接或间接实现了IDependency
            //    //* IsAbstract：是否为抽象类
            //    //* AsImplementedInterfaces：以接口的形式注册

            //    //InstancePerLifetimeScope：同一个Lifetime生成的对象是同一个实例
            //    //SingleInstance：单例模式，每次调用，都会使用同一个实例化的对象；每次都用同一个对象；
            //    //InstancePerDependency：默认模式，每次调用，都会重新实例化对象；每次请求都创建一个新的对象

            //    //Assembly assembly = Assembly.Load(Assembly.GetExecutingAssembly().GetName().Name);
            //    //var dataAccess = Assembly.GetExecutingAssembly();
            //    //var assemblies = AppDomain.CurrentDomain.GetAssemblies().ToList();//这种写法AppDomain重新启动后会丢失程序集

            //    ////第一种
            //    /* 获取接口类型
            //    *通过IDependency标记需要依赖注入的接口
            //    *注册所有实现了IDependency接口的类型
            //    */
            //    //Type type = typeof(IDependency);
            //    //var dataAccess = Assembly.GetExecutingAssembly();

            //    builder.RegisterAssemblyTypes(Assembly.Load("Dn.Core.Services"))
            //           .Where(t => t.Name.EndsWith("Service"))//.As<IDependency>()
            //           .AsImplementedInterfaces().InstancePerLifetimeScope();

            //    ////第二种
            //    //Type baseType = typeof(IDependency);
            //    ////var assemblies = AppDomain.CurrentDomain.GetAssemblies().ToList();//这种写法AppDomain重新启动后会丢失程序集
            //    //var assembly = Assembly.Load("Dn.Core.Services");//Assembly.GetEntryAssembly();
            //    //builder.RegisterAssemblyTypes(assembly)
            //    //                .Where(t => baseType.IsAssignableFrom(t) && t != baseType)
            //    //                .AsImplementedInterfaces().InstancePerLifetimeScope();

            //    #endregion

            //    //var assemblyServices = Assembly.Load("Dn.Repository");
            //    //builder.RegisterAssemblyTypes(assemblyServices).Where(a => a.Name.EndsWith("Repository")).AsSelf();
            //    //builder.RegisterType<Dn.Repository.UnitOfWork>().As<Dn.Repository.IUnitOfWork>().InstancePerLifetimeScope();

            //    #region Repository

            //    try
            //    {
            //        var assemblyServices = Assembly.Load("Dn.SqlSugar.Model");
            //        builder.RegisterAssemblyTypes(assemblyServices).Where(a => a.Name.EndsWith("Repository")).AsSelf().AsImplementedInterfaces();
            //        //builder.RegisterAssemblyTypes(assemblyServices).Where(a => a.Name.EndsWith("Repository")).AsSelf();//.AsImplementedInterfaces().InstancePerLifetimeScope();
            //    }
            //    catch (Exception ex)
            //    {
            //        throw new Exception(ex.Message + "\n" + ex.InnerException);
            //    }

            //    #endregion

            //});

            #endregion
        }

    }
}
